iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
Software Development

Unity遊戲開發與實踐-BlueRemedy內容分享系列 第 17

[Day17]尖刺怪-追蹤主角、受傷

  • 分享至 

  • xImage
  •  

經過了前幾天主角的程式介紹,終於要輪到怪物登場了,今天我們要來介紹如何用程式達到尖刺怪追蹤主角和受到主角攻擊時會扣血的功能。

在開始編寫程式之前,我們先為尖刺怪設定Rigidbody元件及Collider碰撞器,因為尖刺怪的外型比較偏向圓形,所以我選用CircleCollder元件,至於Rigidbody的部分,尖刺怪我們原先的設定是會和地面碰撞,但並不會和主角產生碰撞,所以這一點要到Edit -> Project Settings -> Physics 2D -> Layer Collision Matrix設定。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414Ms8x00ZSch.jpg

我們開始進入到程式的部分,首先我們需要先設定變數,下圖為今天要介紹功能的所有變數,那就由我來為大家介紹。

  • 7~10行,為怪物身上元件相關設定,記得要在Start與怪物做連結
  • Move Settings,用來設定當主角已進入追蹤範圍時,怪物會如何移動的相關設定
  • Track Settings,用來設定判斷主角是否進入追蹤範圍,裡面有個LayerMask則是用來設定主角的圖層
  • Mud Splash,是關於怪物受到攻擊時,會噴出身上的泥巴的相關設定

https://ithelp.ithome.com.tw/upload/images/20200914/2013041426iQZhInbB.jpg

接著我們要設定能夠判斷是否在追蹤範圍內的函式,我們將它命名為FindPlayer,我們用到Physics2D.OverlapCircle,它需要三個參數,分別是原點、半徑、圖層,我們就使用它來判斷以現在的位置,往外半徑FollowRadius是否有主角的圖層,如果有的話就將target設定為主角gameObject。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414vqqpmEOqdZ.jpg

知道的主角是否在追蹤範圍內之後,我們就要讓怪物可以動起來追蹤主角,這時我們再寫一個函式名為Tracking來實現這個功能。

  1. 先判斷怪物的狀態是否符合可以追蹤,需要三個條件都成立才可以開始追蹤,分別是target不是空的、不在攻擊的狀態下、沒有冷卻,都成立後就可以讓怪物播放走路的動畫。
  2. 判斷主角和怪物的距離是否太近,太近的話就不做接下來的動作。
  3. 使用diff.x判斷主角在怪物的左邊還是右邊,還有怪物現在的位置是否超出可以移動的範圍,接著使用rigidbody的velocity實現移動。
  4. 最後使用Mathf.Sign判斷diff.x的正負號,以了解怪物正往哪個方向移動,再調整怪物圖片的方向,讓怪物的移動看起來更加自然。

https://ithelp.ithome.com.tw/upload/images/20200914/20130414wqF4AVZAHB.jpg

最後就是在Update的部分,在適當的情況下加上Tracking的函式,就可以完成追蹤主角的功能囉!


那我們今天還有另外一個任務就是主角攻擊怪物時,會讓怪物扣血的功能,我們需要寫一個函式讓主角在攻擊時能夠抓到這個函式,此函式名為TakeDamage,而且它包含了一個參數,也就是扣血的數值。裡面會用到enemy_dead腳本裡的變數,這個腳本裡的功能會在而外說明。

在進入到TakeDamage之前,我先介紹兩個函式,分別是Freeze和ChangeColor,由於這兩個函式都和等待時間有關,所以我選擇使用IEnumerator來達成協程。

  • Freeze,當怪物被主角攻擊時,會冷卻freezeTime的時間。
  • ChangeColor,怪物被攻擊也會改變自體的顏色,好讓玩家分辨主角是否有正確攻擊到,等待colorChangeTime之後,就會恢復原來的顏色。

https://ithelp.ithome.com.tw/upload/images/20200914/20130414pfBDYHtJgi.jpg

https://ithelp.ithome.com.tw/upload/images/20200914/20130414dcCOp0ILDJ.jpg

接著我們就可以進入到TakeDamage的函式當中,它的流程如下:

  1. 如果怪物還未死亡,就會正常扣血,health是怪物的血量,damage是每次被攻擊時所扣的血量多少。
  2. 若怪物的血量小於等於0的時候,就表示怪物已死亡,這時就會播放怪物死亡的動畫,而且也不能再進行攻擊。
  3. 如果血量還是大於0,且不在攻擊的狀態下,怪物就會播放受傷的動畫,並且冷卻0.5秒,自己身體的顏色也會做變化。
  4. 每當尖物怪受到攻擊的時候,都會噴出身上的泥巴,所以我們要設定一下泥巴生成的位置,是根據泥巴相對怪物的位置去做生成,也就是下方mudSplashPosition、mudSplashRotation、FX_obj這三行程式來達成,最後要記得Destroy泥巴的物件,不然泥巴會停在半空中,整個會變得很奇怪。

https://ithelp.ithome.com.tw/upload/images/20200914/20130414eydAv1s1hb.jpg

這樣我們扣血的功能就可以實現了,那今天任務就達成囉!明天我們還會繼續介紹怪物的其他功能,那我們明天見。


上一篇
[Day16]怪物動畫實作
下一篇
[Day18]尖刺怪-攻擊
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言